home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 2 / AACD 2.iso / AACD / Magazine / GraphicsCards / StormMesa / BeOS / logo.cpp < prev    next >
C/C++ Source or Header  |  1998-12-15  |  38KB  |  1,672 lines

  1. /* generic.c */
  2.  
  3. /* Demo of BEOS Mesa rendering */
  4.  
  5. /*
  6.  * See Mesa/include/GL/osmesa.h for documentation of the OSMesa functions.
  7.  *
  8.  * If you want to render BIG images you'll probably have to increase
  9.  * MAX_WIDTH and MAX_HEIGHT in src/config.h.
  10.  *
  11.  * This program is in the public domain.
  12.  *
  13.  * BEOS output provided by Tinic Urou
  14.  * 5uro@informatik.uni-hamburg.de
  15.  */
  16.  
  17. #include <AppKit.h>
  18. #include <InterfaceKit.h>
  19. #include <KernelKit.h>
  20. #include <stdio.h>
  21. #include <stdlib.h>
  22. #include <string.h>
  23. #include <math.h>
  24. #include "GL/osmesa.h"
  25. #include "GL/glu.h"
  26.  
  27. #define    BLACK 0
  28. #define    GRAY 128
  29. #define    WHITE 255
  30. #define BL 0x00
  31. #define WH 0xFF
  32. #define RD 0xA4,0x00,0x00,0xFF
  33. #define WT 0xFF,0xFF,0xFF,0xFF
  34.  
  35. #define    CHECKIMAGEWIDTH 8
  36. #define    CHECKIMAGEHEIGHT 8
  37. #define    BRICKIMAGEWIDTH 16
  38. #define    BRICKIMAGEHEIGHT 16
  39.  
  40.  
  41. GLenum rgb, doubleBuffer, directRender;
  42.  
  43. float black[3] = {0.0, 0.0, 0.0};
  44. float white[3] = {1.0, 1.0, 1.0};
  45. float gray[3] = {0.5, 0.5, 0.5};
  46. float blue[3] = {0.0, 0.0, 1.0};
  47. GLint colorIndexes[3] = {0, 200, 255};
  48.  
  49. GLenum polyMode;
  50. GLenum dithering;
  51. GLenum shade;
  52. GLenum doStipple;
  53. GLenum noDraw = (GLenum)0;
  54.  
  55. double plane[4] = {1.0, 0.0, -1.0, 0.0};
  56. float xRotation = 30.0, yRotation = 30.0;
  57. float zTranslation = -15.0;
  58.  
  59. GLint singleCylinder;
  60. GLint doubleCylinder;
  61. GLint elbow, logo;
  62.  
  63. GLubyte checkImage[3*CHECKIMAGEWIDTH*CHECKIMAGEHEIGHT] = {
  64.     BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH,
  65.     WH, WH, BL, BL, BL, WH, WH, WH, WH, WH, WH, BL, BL, BL, WH, WH,
  66.     WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL,
  67.     BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH,
  68.     WH, WH, BL, BL, BL, WH, WH, WH, WH, WH, WH, BL, BL, BL, WH, WH,
  69.     WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL,
  70.     BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH,
  71.     WH, WH, BL, BL, BL, WH, WH, WH, WH, WH, WH, BL, BL, BL, WH, WH,
  72.     WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL,
  73.     BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH,
  74.     WH, WH, BL, BL, BL, WH, WH, WH, WH, WH, WH, BL, BL, BL, WH, WH,
  75.     WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, 
  76. };
  77. GLubyte brickImage[4*BRICKIMAGEWIDTH*BRICKIMAGEHEIGHT] = {
  78.     RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
  79.     RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
  80.     RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
  81.     RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
  82.     WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT,
  83.     RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
  84.     RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
  85.     RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
  86.     RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
  87.     WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT,
  88.     RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
  89.     RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
  90.     RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
  91.     RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
  92.     WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT,
  93.     RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD
  94. };
  95.  
  96. GLubyte *image = checkImage;
  97. GLint imageHeight = CHECKIMAGEHEIGHT;
  98. GLint imageWidth = CHECKIMAGEWIDTH;
  99.  
  100. float decal[] = {
  101.     GL_DECAL,
  102. };
  103. float modulate[] = {
  104.     GL_MODULATE,
  105. };
  106. float repeat[] = {
  107.     GL_REPEAT,
  108. };
  109. float nearest[] = {
  110.     GL_NEAREST,
  111. };
  112.  
  113. GLubyte stipple[4*32] = {
  114.     0x00, 0x00, 0x00, 0x00,
  115.     0x00, 0x00, 0x00, 0x00,
  116.     0x00, 0x00, 0x00, 0x00,
  117.     0x00, 0x00, 0x00, 0x00,
  118.     0x00, 0x00, 0x00, 0x00,
  119.     0x00, 0x00, 0x00, 0x00,
  120.     0x00, 0x00, 0x00, 0x00,
  121.     0x00, 0x00, 0x00, 0x00,
  122.  
  123.     0x00, 0x0F, 0xF0, 0x00,
  124.     0x00, 0x0F, 0xF0, 0x00,
  125.     0x00, 0x0F, 0xF0, 0x00,
  126.     0x00, 0x0F, 0xF0, 0x00,
  127.     0x00, 0x0F, 0xF0, 0x00,
  128.     0x00, 0x0F, 0xF0, 0x00,
  129.     0x00, 0x0F, 0xF0, 0x00,
  130.     0x00, 0x0F, 0xF0, 0x00,
  131.  
  132.     0x00, 0x0F, 0xF0, 0x00,
  133.     0x00, 0x0F, 0xF0, 0x00,
  134.     0x00, 0x0F, 0xF0, 0x00,
  135.     0x00, 0x0F, 0xF0, 0x00,
  136.     0x00, 0x0F, 0xF0, 0x00,
  137.     0x00, 0x0F, 0xF0, 0x00,
  138.     0x00, 0x0F, 0xF0, 0x00,
  139.     0x00, 0x0F, 0xF0, 0x00,
  140.  
  141.     0x00, 0x00, 0x00, 0x00,
  142.     0x00, 0x00, 0x00, 0x00,
  143.     0x00, 0x00, 0x00, 0x00,
  144.     0x00, 0x00, 0x00, 0x00,
  145.     0x00, 0x00, 0x00, 0x00,
  146.     0x00, 0x00, 0x00, 0x00,
  147.     0x00, 0x00, 0x00, 0x00,
  148.     0x00, 0x00, 0x00, 0x00,
  149. };
  150.  
  151. float tscp[18][2] = {
  152.     {
  153.     0.0, 0.0
  154.     },
  155.     {
  156.     1.0, 0.0
  157.     },
  158.     {
  159.     0.0, 0.125
  160.     },
  161.     {
  162.     1.0, 0.125
  163.     },
  164.     {
  165.     0.0, 0.250
  166.     },
  167.     {
  168.     1.0, 0.25
  169.     },
  170.     {
  171.     0.0, 0.375
  172.     },
  173.     {
  174.     1.0, 0.375
  175.     },
  176.     {
  177.     0.0, 0.50
  178.     },
  179.     {
  180.     1.0, 0.50
  181.     },
  182.     {
  183.     0.0, 0.625
  184.     },
  185.     {
  186.     1.0, 0.625
  187.     },
  188.     {
  189.     0.0, 0.75
  190.     },
  191.     {
  192.     1.0, 0.75
  193.     },
  194.     {
  195.     0.0, 0.875
  196.     },
  197.     {
  198.     1.0, 0.875
  199.     },
  200.     {
  201.     0.0, 1.0
  202.     },
  203.     {
  204.     1.0, 1.0
  205.     }
  206. };
  207. float scp[18][3] = {
  208.     {
  209.     1.000000, 0.000000, 0.000000
  210.     },
  211.     {
  212.     1.000000, 0.000000, 5.000000
  213.     },
  214.     {
  215.     0.707107, 0.707107, 0.000000
  216.     },
  217.     {
  218.     0.707107, 0.707107, 5.000000
  219.     },
  220.     {
  221.     0.000000, 1.000000, 0.000000
  222.     },
  223.     {
  224.     0.000000, 1.000000, 5.000000
  225.     },
  226.     {
  227.     -0.707107, 0.707107, 0.000000
  228.     },
  229.     {
  230.     -0.707107, 0.707107, 5.000000
  231.     },
  232.     {
  233.     -1.000000, 0.000000, 0.000000
  234.     },
  235.     {
  236.     -1.000000, 0.000000, 5.000000
  237.     },
  238.     {
  239.     -0.707107, -0.707107, 0.000000
  240.     },
  241.     {
  242.     -0.707107, -0.707107, 5.000000
  243.     },
  244.     {
  245.     0.000000, -1.000000, 0.000000
  246.     },
  247.     {
  248.     0.000000, -1.000000, 5.000000
  249.     },
  250.     {
  251.     0.707107, -0.707107, 0.000000
  252.     },
  253.     {
  254.     0.707107, -0.707107, 5.000000
  255.     },
  256.     {
  257.     1.000000, 0.000000, 0.000000
  258.     },
  259.     {
  260.     1.000000, 0.000000, 5.000000
  261.     }
  262. };
  263. float dcp[18][3] = {
  264.     {
  265.     1.000000, 0.000000, 0.000000
  266.     },
  267.     {
  268.     1.000000, 0.000000, 7.000000
  269.     },
  270.     {
  271.     0.707107, 0.707107, 0.000000
  272.     },
  273.     {
  274.     0.707107, 0.707107, 7.000000
  275.     },
  276.     {
  277.     0.000000, 1.000000, 0.000000
  278.     },
  279.     {
  280.     0.000000, 1.000000, 7.000000
  281.     },
  282.     {
  283.     -0.707107, 0.707107, 0.000000
  284.     },
  285.     {
  286.     -0.707107, 0.707107, 7.000000
  287.     },
  288.     {
  289.     -1.000000, 0.000000, 0.000000
  290.     },
  291.     {
  292.     -1.000000, 0.000000, 7.000000
  293.     },
  294.     {
  295.     -0.707107, -0.707107, 0.000000
  296.     },
  297.     {
  298.     -0.707107, -0.707107, 7.000000
  299.     },
  300.     {
  301.     0.000000, -1.000000, 0.000000
  302.     },
  303.     {
  304.     0.000000, -1.000000, 7.000000
  305.     },
  306.     {
  307.     0.707107, -0.707107, 0.000000
  308.     },
  309.     {
  310.     0.707107, -0.707107, 7.000000
  311.     },
  312.     {
  313.     1.000000, 0.000000, 0.000000
  314.     },
  315.     {
  316.     1.000000, 0.000000, 7.000000
  317.     }
  318. };
  319. float ep[7][9][3] = {
  320.     {
  321.     {
  322.         1.000000, 0.000000, 0.000000
  323.     },
  324.     {
  325.         0.707107, 0.707107, 0.000000
  326.     },
  327.     {
  328.         0.000000, 1.000000, 0.000000
  329.     },
  330.     {
  331.         -0.707107, 0.707107, 0.000000
  332.     },
  333.     {
  334.         -1.000000, 0.000000, 0.000000
  335.     },
  336.     {
  337.         -0.707107, -0.707107, 0.000000
  338.     },
  339.     {
  340.         0.000000, -1.000000, 0.000000
  341.     },
  342.     {
  343.         0.707107, -0.707107, 0.000000
  344.     },
  345.     {
  346.         1.000000, 0.000000, 0.000000
  347.     }
  348.     },
  349.     {
  350.     {
  351.         1.000000, 0.034074, 0.258819
  352.     },
  353.     {
  354.         0.707107, 0.717087, 0.075806
  355.     },
  356.     {
  357.         0.000000, 1.000000, 0.000000
  358.     },
  359.     {
  360.         -0.707107, 0.717087, 0.075806
  361.     },
  362.     {
  363.         -1.000000, 0.034074, 0.258819
  364.     },
  365.     {
  366.         -0.707107, -0.648939, 0.441832
  367.     },
  368.     {
  369.         0.000000, -0.931852, 0.517638
  370.     },
  371.     {
  372.         0.707107, -0.648939, 0.441832
  373.     },
  374.     {
  375.         1.000000, 0.034074, 0.258819
  376.     }
  377.     },
  378.     {
  379.     {
  380.         1.000000, 0.133975, 0.500000
  381.     },
  382.     {
  383.         0.707107, 0.746347, 0.146447
  384.     },
  385.     {
  386.         0.000000, 1.000000, 0.000000
  387.     },
  388.     {
  389.         -0.707107, 0.746347, 0.146447
  390.     },
  391.     {
  392.         -1.000000, 0.133975, 0.500000
  393.     },
  394.     {
  395.         -0.707107, -0.478398, 0.853553
  396.     },
  397.     {
  398.         0.000000, -0.732051, 1.000000
  399.     },
  400.     {
  401.         0.707107, -0.478398, 0.853553
  402.     },
  403.     {
  404.         1.000000, 0.133975, 0.500000
  405.     }
  406.     },
  407.     {
  408.     {
  409.         1.000000, 0.292893, 0.707107
  410.     },
  411.     {
  412.         0.707107, 0.792893, 0.207107
  413.     },
  414.     {
  415.         0.000000, 1.000000, 0.000000
  416.     },
  417.     {
  418.         -0.707107, 0.792893, 0.207107
  419.     },
  420.     {
  421.         -1.000000, 0.292893, 0.707107
  422.     },
  423.     {
  424.         -0.707107, -0.207107, 1.207107
  425.     },
  426.     {
  427.         0.000000, -0.414214, 1.414214
  428.     },
  429.     {
  430.         0.707107, -0.207107, 1.207107
  431.     },
  432.     {
  433.         1.000000, 0.292893, 0.707107
  434.     }
  435.     },
  436.     {
  437.     {
  438.         1.000000, 0.500000, 0.866025
  439.     },
  440.     {
  441.         0.707107, 0.853553, 0.253653
  442.     },
  443.     {
  444.         0.000000, 1.000000, 0.000000
  445.     },
  446.     {
  447.         -0.707107, 0.853553, 0.253653
  448.     },
  449.     {
  450.         -1.000000, 0.500000, 0.866025
  451.     },
  452.     {
  453.         -0.707107, 0.146447, 1.478398
  454.     },
  455.     {
  456.         0.000000, 0.000000, 1.732051
  457.     },
  458.     {
  459.         0.707107, 0.146447, 1.478398
  460.     },
  461.     {
  462.         1.000000, 0.500000, 0.866025
  463.     }
  464.     },
  465.     {
  466.     {
  467.         1.000000, 0.741181, 0.965926
  468.     },
  469.     {
  470.         0.707107, 0.924194, 0.282913
  471.     },
  472.     {
  473.         0.000000, 1.000000, 0.000000
  474.     },
  475.     {
  476.         -0.707107, 0.924194, 0.282913
  477.     },
  478.     {
  479.         -1.000000, 0.741181, 0.965926
  480.     },
  481.     {
  482.         -0.707107, 0.558168, 1.648939
  483.     },
  484.     {
  485.         0.000000, 0.482362, 1.931852
  486.     },
  487.     {
  488.         0.707107, 0.558168, 1.648939
  489.     },
  490.     {
  491.         1.000000, 0.741181, 0.965926
  492.     }
  493.     },
  494.     {
  495.     {
  496.         1.000000, 1.000000, 1.000000
  497.     },
  498.     {
  499.         0.707107, 1.000000, 0.292893
  500.     },
  501.     {
  502.         0.000000, 1.000000, 0.000000
  503.     },
  504.     {
  505.         -0.707107, 1.000000, 0.292893
  506.     },
  507.     {
  508.         -1.000000, 1.000000, 1.000000
  509.     },
  510.     {
  511.         -0.707107, 1.000000, 1.707107
  512.     },
  513.     {
  514.         0.000000, 1.000000, 2.000000
  515.     },
  516.     {
  517.         0.707107, 1.000000, 1.707107
  518.     },
  519.     {
  520.         1.000000, 1.000000, 1.000000
  521.     }
  522.     }
  523. };
  524. float en[7][9][3] = {
  525.     {
  526.     {
  527.         1.000000, 0.000000, 0.000000
  528.     },
  529.     {
  530.         0.707107, 0.707107, 0.000000
  531.     },
  532.     {
  533.         0.000000, 1.000000, 0.000000
  534.     },
  535.     {
  536.         -0.707107, 0.707107, 0.000000
  537.     },
  538.     {
  539.         -1.000000, 0.000000, 0.000000
  540.     },
  541.     {
  542.         -0.707107, -0.707107, 0.000000
  543.     },
  544.     {
  545.         0.000000, -1.000000, 0.000000
  546.     },
  547.     {
  548.         0.707107, -0.707107, 0.000000
  549.     },
  550.     {
  551.         1.000000, 0.000000, 0.000000
  552.     }
  553.     },
  554.     {
  555.     {
  556.         1.000000, 0.000000, 0.000000
  557.     },
  558.     {
  559.         0.707107, 0.683013, -0.183013
  560.     },
  561.     {
  562.         0.000000, 0.965926, -0.258819
  563.     },
  564.     {
  565.         -0.707107, 0.683013, -0.183013
  566.     },
  567.     {
  568.         -1.000000, 0.000000, 0.000000
  569.     },
  570.     {
  571.         -0.707107, -0.683013, 0.183013
  572.     },
  573.     {
  574.         0.000000, -0.965926, 0.258819
  575.     },
  576.     {
  577.         0.707107, -0.683013, 0.183013
  578.     },
  579.     {
  580.         1.000000, 0.000000, 0.000000
  581.     }
  582.     },
  583.     {
  584.     {
  585.         1.000000, 0.000000, 0.000000
  586.     },
  587.     {
  588.         0.707107, 0.612372, -0.353553
  589.     },
  590.     {
  591.         0.000000, 0.866025, -0.500000
  592.     },
  593.     {
  594.         -0.707107, 0.612372, -0.353553
  595.     },
  596.     {
  597.         -1.000000, 0.000000, 0.000000
  598.     },
  599.     {
  600.         -0.707107, -0.612372, 0.353553
  601.     },
  602.     {
  603.         0.000000, -0.866025, 0.500000
  604.     },
  605.     {
  606.         0.707107, -0.612372, 0.353553
  607.     },
  608.     {
  609.         1.000000, 0.000000, 0.000000
  610.     }
  611.     },
  612.     {
  613.     {
  614.         1.000000, 0.000000, 0.000000
  615.     },
  616.     {
  617.        /* These 3 lines added by BEP */
  618.         0.707107, 0.500000, -0.500000
  619.     },
  620.     {
  621.         0.000000, 0.707107, -0.707107
  622.     },
  623.     {
  624.         -0.707107, 0.500000, -0.500000
  625.     },
  626.     {
  627.         -1.000000, 0.000000, 0.000000
  628.     },
  629.     {
  630.         -0.707107, -0.500000, 0.500000
  631.     },
  632.     {
  633.         0.000000, -0.707107, 0.707107
  634.     },
  635.     {
  636.         0.707107, -0.500000, 0.500000
  637.     },
  638.     {
  639.         1.000000, 0.000000, 0.000000
  640.     }
  641.     },
  642.     {
  643.     {
  644.         1.000000, 0.000000, 0.000000
  645.     },
  646.     {
  647.         0.707107, 0.353553, -0.612372
  648.     },
  649.     {
  650.         0.000000, 0.500000, -0.866025
  651.     },
  652.     {
  653.         -0.707107, 0.353553, -0.612372
  654.     },
  655.     {
  656.         -1.000000, 0.000000, 0.000000
  657.     },
  658.     {
  659.         -0.707107, -0.353553, 0.612372
  660.     },
  661.     {
  662.         0.000000, -0.500000, 0.866025
  663.     },
  664.     {
  665.         0.707107, -0.353553, 0.612372
  666.     },
  667.     {
  668.         1.000000, 0.000000, 0.000000
  669.     }
  670.     },
  671.     {
  672.     {
  673.         1.000000, 0.000000, 0.000000
  674.     },
  675.     {
  676.         0.707107, 0.183013, -0.683013
  677.     },
  678.     {
  679.         0.000000, 0.258819, -0.965926
  680.     },
  681.     {
  682.         -0.707107, 0.183013, -0.683013
  683.     },
  684.     {
  685.         -1.000000, 0.000000, 0.000000
  686.     },
  687.     {
  688.         -0.707107, -0.183013, 0.683013
  689.     },
  690.     {
  691.         0.000000, -0.258819, 0.965926
  692.     },
  693.     {
  694.         0.707107, -0.183013, 0.683013
  695.     },
  696.     {
  697.         1.000000, 0.000000, 0.000000
  698.     }
  699.     },
  700.     {
  701.     {
  702.         1.000000, 0.000000, 0.000000
  703.     },
  704.     {
  705.         0.707107, 0.000000, -0.707107
  706.     },
  707.     {
  708.         0.000000, 0.000000, -1.000000
  709.     },
  710.     {
  711.         -0.707107, 0.000000, -0.707107
  712.     },
  713.     {
  714.         -1.000000, 0.000000, 0.000000
  715.     },
  716.     {
  717.         -0.707107, 0.000000, 0.707107
  718.     },
  719.     {
  720.         0.000000, 0.000000, 1.000000
  721.     },
  722.     {
  723.         0.707107, 0.000000, 0.707107
  724.     },
  725.     {
  726.         1.000000, 0.000000, 0.000000
  727.     }
  728.     }
  729. };
  730. float tep[7][9][2] = {
  731.     {
  732.     {
  733.         0,     0.0
  734.     },
  735.     {
  736.         0.125, 0.0
  737.     },
  738.     {
  739.         0.25,  0.0
  740.     },
  741.     {
  742.         0.375, 0.0
  743.     },
  744.     {
  745.         0.5,   0.0
  746.     },
  747.     {
  748.         0.625, 0.0
  749.     },
  750.     {
  751.         0.75,  0.0
  752.     },
  753.     {
  754.         0.875, 0.0
  755.     },
  756.     {
  757.         1.0,   0.0
  758.     }
  759.     },
  760.     {
  761.     {
  762.         0,     0.16667
  763.     },
  764.     {
  765.         0.125, 0.16667
  766.     },
  767.     {
  768.         0.25,  0.16667
  769.     },
  770.     {
  771.         0.375, 0.16667
  772.     },
  773.     {
  774.         0.5,   0.16667
  775.     },
  776.     {
  777.         0.625, 0.16667
  778.     },
  779.     {
  780.         0.75,  0.16667
  781.     },
  782.     {
  783.         0.875, 0.16667
  784.     },
  785.     {
  786.         1.0,   0.16667
  787.     }
  788.     },
  789.     {
  790.     {
  791.         0,     0.33333
  792.     },
  793.     {
  794.         0.125, 0.33333
  795.     },
  796.     {
  797.         0.25,  0.33333
  798.     },
  799.     {
  800.         0.375, 0.33333
  801.     },
  802.     {
  803.         0.5,   0.33333
  804.     },
  805.     {
  806.         0.625, 0.33333
  807.     },
  808.     {
  809.         0.75,  0.33333
  810.     },
  811.     {
  812.         0.875, 0.33333
  813.     },
  814.     {
  815.         1.0,   0.33333
  816.     }
  817.     },
  818.     {
  819.     {
  820.         0,     0.5
  821.     },
  822.     {
  823.         0.125, 0.5
  824.     },
  825.     {
  826.         0.25,  0.5
  827.     },
  828.     {
  829.         0.375, 0.5
  830.     },
  831.     {
  832.         0.5,   0.5
  833.     },
  834.     {
  835.         0.625, 0.5
  836.     },
  837.     {
  838.         0.75,  0.5
  839.     },
  840.     {
  841.         0.875, 0.5
  842.     },
  843.     {
  844.         1.0,   0.5
  845.     }
  846.     },
  847.     {
  848.     {
  849.         0,     0.6667
  850.     },
  851.     {
  852.         0.125, 0.6667
  853.     },
  854.     {
  855.         0.25,  0.6667
  856.     },
  857.     {
  858.         0.375, 0.6667
  859.     },
  860.     {
  861.         0.5,   0.6667
  862.     },
  863.     {
  864.         0.625, 0.6667
  865.     },
  866.     {
  867.         0.75,  0.6667
  868.     },
  869.     {
  870.         0.875, 0.6667
  871.     },
  872.     {
  873.         1.0,   0.6667
  874.     }
  875.     },
  876.     {
  877.     {
  878.         0,     0.83333
  879.     },
  880.     {
  881.         0.125, 0.83333
  882.     },
  883.     {
  884.         0.25,  0.83333
  885.     },
  886.     {
  887.         0.375, 0.83333
  888.     },
  889.     {
  890.         0.5,   0.83333
  891.     },
  892.     {
  893.         0.625, 0.83333
  894.     },
  895.     {
  896.         0.75,  0.83333
  897.     },
  898.     {
  899.         0.875, 0.83333
  900.     },
  901.     {
  902.         1.0,   0.83333
  903.     }
  904.     },
  905.     {
  906.     {
  907.         0,     1.0
  908.     },
  909.     {
  910.         0.125, 1.0
  911.     },
  912.     {
  913.         0.25,  1.0
  914.     },
  915.     {
  916.         0.375, 1.0
  917.     },
  918.     {
  919.         0.5,   1.0
  920.     },
  921.     {
  922.         0.625, 1.0
  923.     },
  924.     {
  925.         0.75,  1.0
  926.     },
  927.     {
  928.         0.875, 1.0
  929.     },
  930.     {
  931.         1.0,   1.0
  932.     }
  933.     }
  934. };
  935.  
  936. static void BendForward(void)
  937. {
  938.  
  939.     glTranslatef(0.0, 1.0, 0.0);
  940.     glRotatef(90.0, 1, 0, 0);
  941.     glTranslatef(0.0, -1.0, 0.0);
  942. }
  943.  
  944. static void BendLeft(void)
  945. {
  946.  
  947.     glRotatef(-90.0, 0, 0, 1);
  948.     glTranslatef(0.0, 1.0, 0.0);
  949.     glRotatef(90.0, 1, 0, 0);
  950.     glTranslatef(0.0, -1.0, 0.0);
  951. }
  952.  
  953. static void BendRight(void)
  954. {
  955.  
  956.     glRotatef(90.0, 0, 0, 1);
  957.     glTranslatef(0.0, 1.0, 0.0);
  958.     glRotatef(90.0, 1, 0, 0);
  959.     glTranslatef(0.0, -1.0, 0.0);
  960. }
  961.  
  962. static void BuildSingleCylinder(void)
  963. {
  964.  
  965.     glNewList(singleCylinder, GL_COMPILE);
  966.  
  967.     glBegin(GL_TRIANGLE_STRIP);
  968.        glNormal3fv(scp[0]); glTexCoord2fv(tscp[0]); glVertex3fv(scp[0]);
  969.        glNormal3fv(scp[0]); glTexCoord2fv(tscp[1]); glVertex3fv(scp[1]);
  970.        glNormal3fv(scp[2]); glTexCoord2fv(tscp[2]); glVertex3fv(scp[2]);
  971.        glNormal3fv(scp[2]); glTexCoord2fv(tscp[3]); glVertex3fv(scp[3]);
  972.        glNormal3fv(scp[4]); glTexCoord2fv(tscp[4]); glVertex3fv(scp[4]);
  973.        glNormal3fv(scp[4]); glTexCoord2fv(tscp[5]); glVertex3fv(scp[5]);
  974.        glNormal3fv(scp[6]); glTexCoord2fv(tscp[6]); glVertex3fv(scp[6]);
  975.        glNormal3fv(scp[6]); glTexCoord2fv(tscp[7]); glVertex3fv(scp[7]);
  976.        glNormal3fv(scp[8]); glTexCoord2fv(tscp[8]); glVertex3fv(scp[8]);
  977.        glNormal3fv(scp[8]); glTexCoord2fv(tscp[9]); glVertex3fv(scp[9]);
  978.        glNormal3fv(scp[10]); glTexCoord2fv(tscp[10]); glVertex3fv(scp[10]);
  979.        glNormal3fv(scp[10]); glTexCoord2fv(tscp[11]); glVertex3fv(scp[11]);
  980.        glNormal3fv(scp[12]); glTexCoord2fv(tscp[12]); glVertex3fv(scp[12]);
  981.        glNormal3fv(scp[12]); glTexCoord2fv(tscp[13]); glVertex3fv(scp[13]);
  982.        glNormal3fv(scp[14]); glTexCoord2fv(tscp[14]); glVertex3fv(scp[14]);
  983.        glNormal3fv(scp[14]); glTexCoord2fv(tscp[15]); glVertex3fv(scp[15]);
  984.        glNormal3fv(scp[16]); glTexCoord2fv(tscp[16]); glVertex3fv(scp[16]);
  985.        glNormal3fv(scp[16]); glTexCoord2fv(tscp[17]); glVertex3fv(scp[17]);
  986.     glEnd();
  987.  
  988.     glEndList();
  989. }
  990.  
  991. static void BuildDoubleCylinder(void)
  992. {
  993.  
  994.     glNewList(doubleCylinder, GL_COMPILE);
  995.  
  996.     glBegin(GL_TRIANGLE_STRIP);
  997.     glNormal3fv(dcp[0]); glTexCoord2fv(tscp[0]); glVertex3fv(dcp[0]);
  998.     glNormal3fv(dcp[0]); glTexCoord2fv(tscp[1]); glVertex3fv(dcp[1]);
  999.     glNormal3fv(dcp[2]); glTexCoord2fv(tscp[2]); glVertex3fv(dcp[2]);
  1000.     glNormal3fv(dcp[2]); glTexCoord2fv(tscp[3]); glVertex3fv(dcp[3]);
  1001.     glNormal3fv(dcp[4]); glTexCoord2fv(tscp[4]); glVertex3fv(dcp[4]);
  1002.     glNormal3fv(dcp[4]); glTexCoord2fv(tscp[5]); glVertex3fv(dcp[5]);
  1003.     glNormal3fv(dcp[6]); glTexCoord2fv(tscp[6]); glVertex3fv(dcp[6]);
  1004.     glNormal3fv(dcp[6]); glTexCoord2fv(tscp[7]); glVertex3fv(dcp[7]);
  1005.     glNormal3fv(dcp[8]); glTexCoord2fv(tscp[8]); glVertex3fv(dcp[8]);
  1006.     glNormal3fv(dcp[8]); glTexCoord2fv(tscp[9]); glVertex3fv(dcp[9]);
  1007.     glNormal3fv(dcp[10]); glTexCoord2fv(tscp[10]); glVertex3fv(dcp[10]);
  1008.     glNormal3fv(dcp[10]); glTexCoord2fv(tscp[11]); glVertex3fv(dcp[11]);
  1009.     glNormal3fv(dcp[12]); glTexCoord2fv(tscp[12]); glVertex3fv(dcp[12]);
  1010.     glNormal3fv(dcp[12]); glTexCoord2fv(tscp[13]); glVertex3fv(dcp[13]);
  1011.     glNormal3fv(dcp[14]); glTexCoord2fv(tscp[14]); glVertex3fv(dcp[14]);
  1012.     glNormal3fv(dcp[14]); glTexCoord2fv(tscp[15]); glVertex3fv(dcp[15]);
  1013.     glNormal3fv(dcp[16]); glTexCoord2fv(tscp[16]); glVertex3fv(dcp[16]);
  1014.     glNormal3fv(dcp[16]); glTexCoord2fv(tscp[17]); glVertex3fv(dcp[17]);
  1015.     glEnd();
  1016.  
  1017.     glEndList();
  1018. }
  1019.  
  1020. static void BuildElbow(void)
  1021. {
  1022.  
  1023.     glNewList(elbow, GL_COMPILE);
  1024.  
  1025.     glBegin(GL_TRIANGLE_STRIP);
  1026.     glNormal3fv(en[0][0]); glTexCoord2fv(tep[0][0]); glVertex3fv(ep[0][0]);
  1027.     glNormal3fv(en[1][0]); glTexCoord2fv(tep[1][0]); glVertex3fv(ep[1][0]);
  1028.     glNormal3fv(en[0][1]); glTexCoord2fv(tep[0][1]); glVertex3fv(ep[0][1]);
  1029.     glNormal3fv(en[1][1]); glTexCoord2fv(tep[1][1]); glVertex3fv(ep[1][1]);
  1030.     glNormal3fv(en[0][2]); glTexCoord2fv(tep[0][2]); glVertex3fv(ep[0][2]);
  1031.     glNormal3fv(en[1][2]); glTexCoord2fv(tep[1][2]); glVertex3fv(ep[1][2]);
  1032.     glNormal3fv(en[0][3]); glTexCoord2fv(tep[0][3]); glVertex3fv(ep[0][3]);
  1033.     glNormal3fv(en[1][3]); glTexCoord2fv(tep[1][3]); glVertex3fv(ep[1][3]);
  1034.     glNormal3fv(en[0][4]); glTexCoord2fv(tep[0][4]); glVertex3fv(ep[0][4]);
  1035.     glNormal3fv(en[1][4]); glTexCoord2fv(tep[1][4]); glVertex3fv(ep[1][4]);
  1036.     glNormal3fv(en[0][5]); glTexCoord2fv(tep[0][5]); glVertex3fv(ep[0][5]);
  1037.     glNormal3fv(en[1][5]); glTexCoord2fv(tep[1][5]); glVertex3fv(ep[1][5]);
  1038.     glNormal3fv(en[0][6]); glTexCoord2fv(tep[0][6]); glVertex3fv(ep[0][6]);
  1039.     glNormal3fv(en[1][6]); glTexCoord2fv(tep[1][6]); glVertex3fv(ep[1][6]);
  1040.     glNormal3fv(en[0][7]); glTexCoord2fv(tep[0][7]); glVertex3fv(ep[0][7]);
  1041.     glNormal3fv(en[1][7]); glTexCoord2fv(tep[1][7]); glVertex3fv(ep[1][7]);
  1042.     glNormal3fv(en[0][8]); glTexCoord2fv(tep[0][8]); glVertex3fv(ep[0][8]);
  1043.     glNormal3fv(en[1][8]); glTexCoord2fv(tep[1][8]); glVertex3fv(ep[1][8]);
  1044.     glEnd();
  1045.     glBegin(GL_TRIANGLE_STRIP);
  1046.     glNormal3fv(en[1][0]); glTexCoord2fv(tep[1][0]); glVertex3fv(ep[1][0]);
  1047.     glNormal3fv(en[2][0]); glTexCoord2fv(tep[2][0]); glVertex3fv(ep[2][0]);
  1048.     glNormal3fv(en[1][1]); glTexCoord2fv(tep[1][1]); glVertex3fv(ep[1][1]);
  1049.     glNormal3fv(en[2][1]); glTexCoord2fv(tep[2][1]); glVertex3fv(ep[2][1]);
  1050.     glNormal3fv(en[1][2]); glTexCoord2fv(tep[1][2]); glVertex3fv(ep[1][2]);
  1051.     glNormal3fv(en[2][2]); glTexCoord2fv(tep[2][2]); glVertex3fv(ep[2][2]);
  1052.     glNormal3fv(en[1][3]); glTexCoord2fv(tep[1][3]); glVertex3fv(ep[1][3]);
  1053.     glNormal3fv(en[2][3]); glTexCoord2fv(tep[2][3]); glVertex3fv(ep[2][3]);
  1054.     glNormal3fv(en[1][4]); glTexCoord2fv(tep[1][4]); glVertex3fv(ep[1][4]);
  1055.     glNormal3fv(en[2][4]); glTexCoord2fv(tep[2][4]); glVertex3fv(ep[2][4]);
  1056.     glNormal3fv(en[1][5]); glTexCoord2fv(tep[1][5]); glVertex3fv(ep[1][5]);
  1057.     glNormal3fv(en[2][5]); glTexCoord2fv(tep[2][5]); glVertex3fv(ep[2][5]);
  1058.     glNormal3fv(en[1][6]); glTexCoord2fv(tep[1][6]); glVertex3fv(ep[1][6]);
  1059.     glNormal3fv(en[2][6]); glTexCoord2fv(tep[2][6]); glVertex3fv(ep[2][6]);
  1060.     glNormal3fv(en[1][7]); glTexCoord2fv(tep[1][7]); glVertex3fv(ep[1][7]);
  1061.     glNormal3fv(en[2][7]); glTexCoord2fv(tep[2][7]); glVertex3fv(ep[2][7]);
  1062.     glNormal3fv(en[1][8]); glTexCoord2fv(tep[1][8]); glVertex3fv(ep[1][8]);
  1063.     glNormal3fv(en[2][8]); glTexCoord2fv(tep[2][8]); glVertex3fv(ep[2][8]);
  1064.     glEnd();
  1065.     glBegin(GL_TRIANGLE_STRIP);
  1066.     glNormal3fv(en[2][0]); glTexCoord2fv(tep[2][0]); glVertex3fv(ep[2][0]);
  1067.     glNormal3fv(en[3][0]); glTexCoord2fv(tep[3][0]); glVertex3fv(ep[3][0]);
  1068.     glNormal3fv(en[2][1]); glTexCoord2fv(tep[2][1]); glVertex3fv(ep[2][1]);
  1069.     glNormal3fv(en[3][1]); glTexCoord2fv(tep[3][1]); glVertex3fv(ep[3][1]);
  1070.     glNormal3fv(en[2][2]); glTexCoord2fv(tep[2][2]); glVertex3fv(ep[2][2]);
  1071.     glNormal3fv(en[3][2]); glTexCoord2fv(tep[3][2]); glVertex3fv(ep[3][2]);
  1072.     glNormal3fv(en[2][3]); glTexCoord2fv(tep[2][3]); glVertex3fv(ep[2][3]);
  1073.     glNormal3fv(en[3][3]); glTexCoord2fv(tep[3][3]); glVertex3fv(ep[3][3]);
  1074.     glNormal3fv(en[2][4]); glTexCoord2fv(tep[2][4]); glVertex3fv(ep[2][4]);
  1075.     glNormal3fv(en[3][4]); glTexCoord2fv(tep[3][4]); glVertex3fv(ep[3][4]);
  1076.     glNormal3fv(en[2][5]); glTexCoord2fv(tep[2][5]); glVertex3fv(ep[2][5]);
  1077.     glNormal3fv(en[3][5]); glTexCoord2fv(tep[3][5]); glVertex3fv(ep[3][5]);
  1078.     glNormal3fv(en[2][6]); glTexCoord2fv(tep[2][6]); glVertex3fv(ep[2][6]);
  1079.     glNormal3fv(en[3][6]); glTexCoord2fv(tep[3][6]); glVertex3fv(ep[3][6]);
  1080.     glNormal3fv(en[2][7]); glTexCoord2fv(tep[2][7]); glVertex3fv(ep[2][7]);
  1081.     glNormal3fv(en[3][7]); glTexCoord2fv(tep[3][7]); glVertex3fv(ep[3][7]);
  1082.     glNormal3fv(en[2][8]); glTexCoord2fv(tep[2][8]); glVertex3fv(ep[2][8]);
  1083.     glNormal3fv(en[3][8]); glTexCoord2fv(tep[3][8]); glVertex3fv(ep[3][8]);
  1084.     glEnd();
  1085.     glBegin(GL_TRIANGLE_STRIP);
  1086.     glNormal3fv(en[3][0]); glTexCoord2fv(tep[3][0]); glVertex3fv(ep[3][0]);
  1087.     glNormal3fv(en[4][0]); glTexCoord2fv(tep[4][0]); glVertex3fv(ep[4][0]);
  1088.     glNormal3fv(en[3][1]); glTexCoord2fv(tep[3][1]); glVertex3fv(ep[3][1]);
  1089.     glNormal3fv(en[4][1]); glTexCoord2fv(tep[4][1]); glVertex3fv(ep[4][1]);
  1090.     glNormal3fv(en[3][2]); glTexCoord2fv(tep[3][2]); glVertex3fv(ep[3][2]);
  1091.     glNormal3fv(en[4][2]); glTexCoord2fv(tep[4][2]); glVertex3fv(ep[4][2]);
  1092.     glNormal3fv(en[3][3]); glTexCoord2fv(tep[3][3]); glVertex3fv(ep[3][3]);
  1093.     glNormal3fv(en[4][3]); glTexCoord2fv(tep[4][3]); glVertex3fv(ep[4][3]);
  1094.     glNormal3fv(en[3][4]); glTexCoord2fv(tep[3][4]); glVertex3fv(ep[3][4]);
  1095.     glNormal3fv(en[4][4]); glTexCoord2fv(tep[4][4]); glVertex3fv(ep[4][4]);
  1096.     glNormal3fv(en[3][5]); glTexCoord2fv(tep[3][5]); glVertex3fv(ep[3][5]);
  1097.     glNormal3fv(en[4][5]); glTexCoord2fv(tep[4][5]); glVertex3fv(ep[4][5]);
  1098.     glNormal3fv(en[3][6]); glTexCoord2fv(tep[3][6]); glVertex3fv(ep[3][6]);
  1099.     glNormal3fv(en[4][6]); glTexCoord2fv(tep[4][6]); glVertex3fv(ep[4][6]);
  1100.     glNormal3fv(en[3][7]); glTexCoord2fv(tep[3][7]); glVertex3fv(ep[3][7]);
  1101.     glNormal3fv(en[4][7]); glTexCoord2fv(tep[4][7]); glVertex3fv(ep[4][7]);
  1102.     glNormal3fv(en[3][8]); glTexCoord2fv(tep[3][8]); glVertex3fv(ep[3][8]);
  1103.     glNormal3fv(en[4][8]); glTexCoord2fv(tep[4][8]); glVertex3fv(ep[4][8]);
  1104.     glEnd();
  1105.     glBegin(GL_TRIANGLE_STRIP);
  1106.     glNormal3fv(en[4][0]); glTexCoord2fv(tep[4][0]); glVertex3fv(ep[4][0]);
  1107.     glNormal3fv(en[5][0]); glTexCoord2fv(tep[5][0]); glVertex3fv(ep[5][0]);
  1108.     glNormal3fv(en[4][1]); glTexCoord2fv(tep[4][1]); glVertex3fv(ep[4][1]);
  1109.     glNormal3fv(en[5][1]); glTexCoord2fv(tep[5][1]); glVertex3fv(ep[5][1]);
  1110.     glNormal3fv(en[4][2]); glTexCoord2fv(tep[4][2]); glVertex3fv(ep[4][2]);
  1111.     glNormal3fv(en[5][2]); glTexCoord2fv(tep[5][2]); glVertex3fv(ep[5][2]);
  1112.     glNormal3fv(en[4][3]); glTexCoord2fv(tep[4][3]); glVertex3fv(ep[4][3]);
  1113.     glNormal3fv(en[5][3]); glTexCoord2fv(tep[5][3]); glVertex3fv(ep[5][3]);
  1114.     glNormal3fv(en[4][4]); glTexCoord2fv(tep[4][4]); glVertex3fv(ep[4][4]);
  1115.     glNormal3fv(en[5][4]); glTexCoord2fv(tep[5][4]); glVertex3fv(ep[5][4]);
  1116.     glNormal3fv(en[4][5]); glTexCoord2fv(tep[4][5]); glVertex3fv(ep[4][5]);
  1117.     glNormal3fv(en[5][5]); glTexCoord2fv(tep[5][5]); glVertex3fv(ep[5][5]);
  1118.     glNormal3fv(en[4][6]); glTexCoord2fv(tep[4][6]); glVertex3fv(ep[4][6]);
  1119.     glNormal3fv(en[5][6]); glTexCoord2fv(tep[5][6]); glVertex3fv(ep[5][6]);
  1120.     glNormal3fv(en[4][7]); glTexCoord2fv(tep[4][7]); glVertex3fv(ep[4][7]);
  1121.     glNormal3fv(en[5][7]); glTexCoord2fv(tep[5][7]); glVertex3fv(ep[5][7]);
  1122.     glNormal3fv(en[4][8]); glTexCoord2fv(tep[4][8]); glVertex3fv(ep[4][8]);
  1123.     glNormal3fv(en[5][8]); glTexCoord2fv(tep[5][8]); glVertex3fv(ep[5][8]);
  1124.     glEnd();
  1125.     glBegin(GL_TRIANGLE_STRIP);
  1126.     glNormal3fv(en[5][0]); glTexCoord2fv(tep[5][0]); glVertex3fv(ep[5][0]);
  1127.     glNormal3fv(en[6][0]); glTexCoord2fv(tep[6][0]); glVertex3fv(ep[6][0]);
  1128.     glNormal3fv(en[5][1]); glTexCoord2fv(tep[5][1]); glVertex3fv(ep[5][1]);
  1129.     glNormal3fv(en[6][1]); glTexCoord2fv(tep[6][1]); glVertex3fv(ep[6][1]);
  1130.     glNormal3fv(en[5][2]); glTexCoord2fv(tep[5][2]); glVertex3fv(ep[5][2]);
  1131.     glNormal3fv(en[6][2]); glTexCoord2fv(tep[6][2]); glVertex3fv(ep[6][2]);
  1132.     glNormal3fv(en[5][3]); glTexCoord2fv(tep[5][3]); glVertex3fv(ep[5][3]);
  1133.     glNormal3fv(en[6][3]); glTexCoord2fv(tep[6][3]); glVertex3fv(ep[6][3]);
  1134.     glNormal3fv(en[5][4]); glTexCoord2fv(tep[5][4]); glVertex3fv(ep[5][4]);
  1135.     glNormal3fv(en[6][4]); glTexCoord2fv(tep[6][4]); glVertex3fv(ep[6][4]);
  1136.     glNormal3fv(en[5][5]); glTexCoord2fv(tep[5][5]); glVertex3fv(ep[5][5]);
  1137.     glNormal3fv(en[6][5]); glTexCoord2fv(tep[6][5]); glVertex3fv(ep[6][5]);
  1138.     glNormal3fv(en[5][6]); glTexCoord2fv(tep[5][6]); glVertex3fv(ep[5][6]);
  1139.     glNormal3fv(en[6][6]); glTexCoord2fv(tep[6][6]); glVertex3fv(ep[6][6]);
  1140.     glNormal3fv(en[5][7]); glTexCoord2fv(tep[5][7]); glVertex3fv(ep[5][7]);
  1141.     glNormal3fv(en[6][7]); glTexCoord2fv(tep[6][7]); glVertex3fv(ep[6][7]);
  1142.     glNormal3fv(en[5][8]); glTexCoord2fv(tep[5][8]); glVertex3fv(ep[5][8]);
  1143.     glNormal3fv(en[6][8]); glTexCoord2fv(tep[6][8]); glVertex3fv(ep[6][8]);
  1144.     glEnd();
  1145.  
  1146.     glEndList();
  1147. }
  1148.  
  1149. static void BuildLogo(void)
  1150. {
  1151.  
  1152.     glNewList(logo, GL_COMPILE);
  1153.  
  1154.     glTranslatef(5.5, -3.5, 4.5);
  1155.     glTranslatef(0.0, 0.0, -7.0);
  1156.     glCallList(doubleCylinder);
  1157.     BendForward();
  1158.     glCallList(elbow);
  1159.     glTranslatef(0.0, 0.0, -7.0);
  1160.     glCallList(doubleCylinder);
  1161.     BendForward();
  1162.     glCallList(elbow);
  1163.     glTranslatef(0.0, 0.0, -5.0);
  1164.     glCallList(singleCylinder);
  1165.     BendRight();
  1166.     glCallList(elbow);
  1167.     glTranslatef(0.0, 0.0, -7.0);
  1168.     glCallList(doubleCylinder);
  1169.     BendForward();
  1170.     glCallList(elbow);
  1171.     glTranslatef(0.0, 0.0, -7.0);
  1172.     glCallList(doubleCylinder);
  1173.     BendForward();
  1174.     glCallList(elbow);
  1175.     glTranslatef(0.0, 0.0, -5.0);
  1176.     glCallList(singleCylinder);
  1177.     BendLeft();
  1178.     glCallList(elbow);
  1179.     glTranslatef(0.0, 0.0, -7.0);
  1180.     glCallList(doubleCylinder);
  1181.     BendForward();
  1182.     glCallList(elbow);
  1183.     glTranslatef(0.0, 0.0, -7.0);
  1184.     glCallList(doubleCylinder);
  1185.     BendForward();
  1186.     glCallList(elbow);
  1187.     glTranslatef(0.0, 0.0, -5.0);
  1188.     glCallList(singleCylinder);
  1189.     BendRight();
  1190.     glCallList(elbow);
  1191.     glTranslatef(0.0, 0.0, -7.0);
  1192.     glCallList(doubleCylinder);
  1193.     BendForward();
  1194.     glCallList(elbow);
  1195.     glTranslatef(0.0, 0.0, -7.0);
  1196.     glCallList(doubleCylinder);
  1197.     BendForward();
  1198.     glCallList(elbow);
  1199.     glTranslatef(0.0, 0.0, -5.0);
  1200.     glCallList(singleCylinder);
  1201.     BendLeft();
  1202.     glCallList(elbow);
  1203.     glTranslatef(0.0, 0.0, -7.0);
  1204.     glCallList(doubleCylinder);
  1205.     BendForward();
  1206.     glCallList(elbow);
  1207.     glTranslatef(0.0, 0.0, -7.0);
  1208.     glCallList(doubleCylinder);
  1209.     BendForward();
  1210.     glCallList(elbow);
  1211.     glTranslatef(0.0, 0.0, -5.0);
  1212.     glCallList(singleCylinder);
  1213.     BendRight();
  1214.     glCallList(elbow);
  1215.     glTranslatef(0.0, 0.0, -7.0);
  1216.     glCallList(doubleCylinder);
  1217.     BendForward();
  1218.     glCallList(elbow);
  1219.     glTranslatef(0.0, 0.0, -7.0);
  1220.     glCallList(doubleCylinder);
  1221.     BendForward();
  1222.     glCallList(elbow);
  1223.     glTranslatef(0.0, 0.0, -5.0);
  1224.     glCallList(singleCylinder);
  1225.     BendLeft();
  1226.     glCallList(elbow);
  1227.  
  1228.     glEndList();
  1229. }
  1230.  
  1231. static void BuildLists(void)
  1232. {
  1233.  
  1234.     singleCylinder = glGenLists(1);
  1235.     doubleCylinder = glGenLists(1);
  1236.     elbow = glGenLists(1);
  1237.     logo = glGenLists(1);
  1238.  
  1239.     BuildSingleCylinder();
  1240.     BuildDoubleCylinder();
  1241.     BuildElbow();
  1242.     BuildLogo();
  1243. }
  1244.  
  1245. static void Init(void)
  1246. {
  1247.     static float ambient[] = {0.1, 0.1, 0.1, 1.0};
  1248.     static float diffuse[] = {0.5, 1.0, 1.0, 1.0};
  1249.     static float position[] = {90.0, 90.0, 150.0, 0.0};
  1250.     static float front_mat_shininess[] = {30.0};
  1251.     static float front_mat_specular[] = {0.2, 0.2, 0.2, 1.0};
  1252.     static float front_mat_diffuse[] = {0.5, 0.28, 0.38, 1.0};
  1253.     static float back_mat_shininess[] = {50.0};
  1254.     static float back_mat_specular[] = {0.5, 0.5, 0.2, 1.0};
  1255.     static float back_mat_diffuse[] = {1.0, 1.0, 0.2, 1.0};
  1256.     static float lmodel_ambient[] = {1.0, 1.0, 1.0, 1.0};
  1257.     static float lmodel_twoside[] = {GL_TRUE};
  1258.  
  1259.     glClearColor(0.0, 0.0, 0.0, 0.0);
  1260.  
  1261.     glFrontFace(GL_CW);
  1262.  
  1263.     glEnable(GL_DEPTH_TEST);
  1264.  
  1265.     glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
  1266.     glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
  1267.     glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
  1268.     glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
  1269.     glLightfv(GL_LIGHT0, GL_POSITION, position);
  1270.     glEnable(GL_LIGHTING);
  1271.     glEnable(GL_LIGHT0);
  1272.     
  1273.     glMaterialfv(GL_FRONT, GL_SHININESS, front_mat_shininess);
  1274.     glMaterialfv(GL_FRONT, GL_SPECULAR, front_mat_specular);
  1275.     glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
  1276.     glMaterialfv(GL_BACK, GL_SHININESS, back_mat_shininess);
  1277.     glMaterialfv(GL_BACK, GL_SPECULAR, back_mat_specular);
  1278.     glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
  1279.  
  1280.     glEnable(GL_CLIP_PLANE0);
  1281.  
  1282.     glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, decal);
  1283.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
  1284.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
  1285.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nearest);
  1286.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nearest);
  1287.     glTexImage2D(GL_TEXTURE_2D, 0, 3, CHECKIMAGEWIDTH, CHECKIMAGEHEIGHT, 0,
  1288.              GL_RGB, GL_UNSIGNED_BYTE, (GLvoid *)checkImage);
  1289.     glEnable(GL_TEXTURE_2D);
  1290.  
  1291.     glCullFace(GL_BACK);
  1292.     glEnable(GL_CULL_FACE);
  1293.  
  1294.     BuildLists();
  1295.  
  1296.     dithering = GL_TRUE;
  1297.     shade = GL_TRUE;
  1298.     doStipple = GL_FALSE;
  1299.     polyMode = GL_BACK;
  1300. }
  1301.  
  1302. static void Reshape(int width, int height)
  1303. {
  1304.     glViewport(0, 0, (GLint)width, (GLint)height);
  1305.  
  1306.     glMatrixMode(GL_PROJECTION);
  1307.     glLoadIdentity();
  1308.     gluPerspective(90, 1.0, 1.0, 200.0);
  1309.     glMatrixMode(GL_MODELVIEW);
  1310. }
  1311.  
  1312. static GLenum Key(int key, GLenum mask)
  1313. {
  1314.     return GL_TRUE;
  1315. }
  1316.  
  1317. static void Draw(void)
  1318. {
  1319.  
  1320.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  1321.  
  1322.     glPushMatrix();
  1323.  
  1324.     glTranslatef(0, 0, zTranslation);
  1325.     glRotatef(30.0, 1, 0, 0);
  1326.     glRotatef(yRotation, 0, 1, 0);
  1327.     glClipPlane(GL_CLIP_PLANE0, plane);
  1328.     glCallList(logo);
  1329.  
  1330.     glPopMatrix();
  1331.  
  1332.     glFlush();
  1333. }
  1334.  
  1335. static GLenum Args(int argc, char **argv)
  1336. {
  1337.     GLint i;
  1338.  
  1339.     rgb = GL_TRUE;
  1340.     doubleBuffer = GL_FALSE;
  1341.     directRender = GL_TRUE;
  1342.  
  1343.     for (i = 1; i < argc; i++) {
  1344.     if (strcmp(argv[i], "-ci") == 0) {
  1345.         rgb = GL_FALSE;
  1346.     } else if (strcmp(argv[i], "-rgb") == 0) {
  1347.         rgb = GL_TRUE;
  1348.     } else if (strcmp(argv[i], "-sb") == 0) {
  1349.         doubleBuffer = GL_FALSE;
  1350.     } else if (strcmp(argv[i], "-db") == 0) {
  1351.         doubleBuffer = GL_TRUE;
  1352.     } else if (strcmp(argv[i], "-dr") == 0) {
  1353.         directRender = GL_TRUE;
  1354.     } else if (strcmp(argv[i], "-ir") == 0) {
  1355.         directRender = GL_FALSE;
  1356.     } else {
  1357.         printf("%s (Bad option).\n", argv[i]);
  1358.         return GL_FALSE;
  1359.     }
  1360.     }
  1361.     return GL_TRUE;
  1362. }
  1363.  
  1364. int                     gl_width=300,gl_height=300;
  1365.  
  1366. const     ulong             APP_SIGNATURE = '????';
  1367. const     ulong            MSG_REDRAW = 1;
  1368.  
  1369. class                     MesaWindow;
  1370. class                     MesaView;
  1371. class                    MesaApp;
  1372.  
  1373. // Lets make our life easy and make them global:
  1374.  
  1375. BBitmap                 *the_bitmap;
  1376. MesaView                *the_view;    
  1377. MesaWindow                 *the_window;
  1378.  
  1379. class MesaView : public BView
  1380. {
  1381.     public:
  1382.     
  1383.     MesaView(BRect frame):BView(frame,"Mesa View",B_FOLLOW_NONE,B_WILL_DRAW)
  1384.     {
  1385.     };
  1386.     
  1387.     void KeyDown(ulong aKey)
  1388.     {
  1389.         switch(aKey)
  1390.         {
  1391.               case     B_LEFT_ARROW:
  1392.                     yRotation += 0.5;
  1393.                     break;
  1394.               case     B_RIGHT_ARROW:
  1395.                     yRotation -= 0.5;
  1396.                     break;
  1397.               case     B_UP_ARROW:
  1398.                     plane[3] += 2.0;
  1399.                     break;
  1400.               case     B_DOWN_ARROW:
  1401.                     plane[3] -= 2.0;
  1402.                     break;
  1403.               case     'Z':
  1404.                     zTranslation -= 1.0;
  1405.                     break;
  1406.               case     'z':
  1407.                     zTranslation += 1.0;
  1408.                     break;
  1409.  
  1410.               case     '1':
  1411.                     glPolygonMode(polyMode, GL_POINT);
  1412.                     break;
  1413.               case     '2':
  1414.                     glPolygonMode(polyMode, GL_LINE);
  1415.                     break;
  1416.               case     '3':
  1417.                     glPolygonMode(polyMode, GL_FILL);
  1418.                     break;
  1419.               case     'p':
  1420.                     switch (polyMode) 
  1421.                     {
  1422.                           case     GL_BACK:
  1423.                                 polyMode = GL_FRONT;
  1424.                                 break;
  1425.                           case     GL_FRONT:
  1426.                                 polyMode = GL_FRONT_AND_BACK;
  1427.                                 break;
  1428.                           case     GL_FRONT_AND_BACK:
  1429.                                 polyMode = GL_BACK;
  1430.                                 break;
  1431.                     }
  1432.                     break;
  1433.  
  1434.               case     '4':
  1435.                     glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
  1436.                     break;
  1437.               case     '5':
  1438.                     glEnable(GL_POLYGON_SMOOTH);
  1439.                     glBlendFunc(GL_SRC_ALPHA, GL_ONE);
  1440.                     glEnable(GL_BLEND);
  1441.                     glDisable(GL_DEPTH_TEST);
  1442.                     break;
  1443.               case     '6':
  1444.                     glDisable(GL_POLYGON_SMOOTH);
  1445.                     glBlendFunc(GL_ONE, GL_ZERO);
  1446.                     glDisable(GL_BLEND);
  1447.                     glEnable(GL_DEPTH_TEST);
  1448.                     break;
  1449.  
  1450.              case     '8':
  1451.                     dithering = (GLenum)!dithering;
  1452.                     (dithering) ? glEnable(GL_DITHER) : glDisable(GL_DITHER);
  1453.                     break;
  1454.  
  1455.               case     '9':
  1456.                     doStipple = (GLenum)!doStipple;
  1457.                     if (doStipple) 
  1458.                     {
  1459.                         glPolygonStipple(stipple);
  1460.                         glEnable(GL_POLYGON_STIPPLE);
  1461.                     }
  1462.                     else 
  1463.                     {
  1464.                         glDisable(GL_POLYGON_STIPPLE);
  1465.                     }
  1466.                     break;
  1467.  
  1468.               case     '0':
  1469.                     shade = (GLenum)!shade;
  1470.                     (shade) ? glShadeModel(GL_SMOOTH) : glShadeModel(GL_FLAT);
  1471.                     break;
  1472.  
  1473.               case     'q':
  1474.                     glDisable(GL_CULL_FACE);
  1475.                     break;
  1476.               case     'w':
  1477.                     glEnable(GL_CULL_FACE);
  1478.                     glCullFace(GL_FRONT);
  1479.                     break;
  1480.               case     'e':
  1481.                     glEnable(GL_CULL_FACE);
  1482.                     glCullFace(GL_BACK);
  1483.                     break;
  1484.  
  1485.               case     'r':
  1486.                     glFrontFace(GL_CW);
  1487.                     break;
  1488.               case     't': 
  1489.                     glFrontFace(GL_CCW);
  1490.                     break;
  1491.               case     'y':
  1492.                     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  1493.                     glPixelStorei(GL_UNPACK_LSB_FIRST, 0);
  1494.                     glPolygonStipple(stipple);
  1495.                     break;
  1496.               case     'u':
  1497.                     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  1498.                     glPixelStorei(GL_UNPACK_LSB_FIRST, 1);
  1499.                     glPolygonStipple(stipple);
  1500.                     break;
  1501.  
  1502.               case     'a':
  1503.                     glEnable(GL_TEXTURE_2D);
  1504.                     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
  1505.                     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
  1506.                     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nearest);
  1507.                     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nearest);
  1508.                     glTexImage2D(GL_TEXTURE_2D, 0, 4, BRICKIMAGEWIDTH,
  1509.                      BRICKIMAGEHEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE,
  1510.                      (GLvoid *)brickImage);
  1511.                     break;
  1512.               case     's':
  1513.                     glEnable(GL_TEXTURE_2D);
  1514.                     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
  1515.                     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
  1516.                     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nearest);
  1517.                     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nearest);
  1518.                     glTexImage2D(GL_TEXTURE_2D, 0, 3, CHECKIMAGEWIDTH,
  1519.                      CHECKIMAGEHEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE,
  1520.                      (GLvoid *)checkImage);
  1521.                     break;
  1522.               case     'd':
  1523.                     glDisable(GL_TEXTURE_2D);
  1524.                     break;
  1525.  
  1526.               case     'f':
  1527.                     glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, decal);
  1528.                     break;
  1529.               case     'g':
  1530.                     glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, modulate);
  1531.                     break;
  1532.  
  1533.               case     'n':
  1534.                     noDraw = (GLenum)!noDraw;
  1535.                     if (noDraw) 
  1536.                     {
  1537.                           glDrawBuffer( GL_NONE );
  1538.                     }
  1539.                     else 
  1540.                     {
  1541.                            if (doubleBuffer) 
  1542.                         {
  1543.                               glDrawBuffer( GL_BACK );
  1544.                            }
  1545.                            else 
  1546.                         {
  1547.                               glDrawBuffer( GL_FRONT );
  1548.                            }
  1549.                     }
  1550.                     break;
  1551.         }
  1552.     };
  1553.     
  1554.     void Draw(BRect frame)
  1555.     {
  1556.         DrawBitmap(the_bitmap,BPoint(0,0));
  1557.     };                    
  1558. };
  1559.  
  1560. class MesaWindow : public BWindow 
  1561. {
  1562.     public:
  1563.     
  1564.     MesaWindow(int width, int height):BWindow(BRect(0,0,width-1,height-1),"MesaView",B_TITLED_WINDOW,B_NOT_RESIZABLE|B_NOT_ZOOMABLE)
  1565.     {
  1566.         // Move window to right position
  1567.         MoveTo(80, 24);
  1568.         // Create bitmap view
  1569.         Lock();
  1570.         AddChild(the_view = new MesaView(BRect(0, 0, (gl_width)-1, (gl_height)-1)));
  1571.         the_view->MakeFocus();
  1572.         Unlock();
  1573.     };
  1574.     
  1575.     void MessageReceived(BMessage *msg)
  1576.     {
  1577.         switch(msg->what)
  1578.         {    
  1579.             case    MSG_REDRAW:
  1580.                     Lock();
  1581.                     the_view->DrawBitmap(the_bitmap,BPoint(0,0));
  1582.                     Draw();
  1583.                     Unlock();
  1584.                     PostMessage(MSG_REDRAW);
  1585.                     break;
  1586.             default:
  1587.                     BWindow::MessageReceived(msg);
  1588.                     break;
  1589.         }
  1590.     };
  1591.     
  1592.     bool QuitRequested(void)
  1593.     {
  1594.         be_app->PostMessage(B_QUIT_REQUESTED);
  1595.         return TRUE;
  1596.     };
  1597. };
  1598.  
  1599. class MesaApp : public BApplication 
  1600. {
  1601.     OSMesaContext ctx;
  1602.     
  1603.     public:
  1604.     
  1605.     MesaApp():BApplication(APP_SIGNATURE)
  1606.     {
  1607.         the_window = NULL;
  1608.         the_bitmap = NULL;
  1609.     };
  1610.             
  1611.     void ReadyToRun(void)
  1612.     {
  1613.         // Allocate the bitmap        
  1614.         the_bitmap = new BBitmap(BRect(0, 0, gl_width-1, gl_height-1), B_RGB_32_BIT);
  1615.  
  1616.         uchar *bits = (uchar *)the_bitmap->Bits();
  1617.  
  1618.         memset(bits,0,the_bitmap->BytesPerRow()*gl_height);
  1619.  
  1620.         // Open window
  1621.         the_window = new MesaWindow((gl_width),(gl_height));
  1622.         the_window->Show();
  1623.  
  1624.         unsigned char *buffer;
  1625.         double start,end;
  1626.  
  1627.         // Create an RGBA-mode context 
  1628.         ctx = OSMesaCreateContext( GL_RGBA, NULL );
  1629.  
  1630.         // Bind the buffer to the context and make it current */
  1631.         OSMesaMakeCurrent( ctx, bits, GL_UNSIGNED_BYTE, gl_width, gl_height );
  1632.         OSMesaPixelStore( OSMESA_Y_UP, 0 );
  1633.  
  1634.         Init();
  1635.         Reshape(gl_width,gl_height);
  1636.         the_window->PostMessage(MSG_REDRAW);    
  1637.     };
  1638.  
  1639.     bool QuitRequested(void)
  1640.     {
  1641.         // Make sure that the window closes first
  1642.         if (BApplication::QuitRequested()) 
  1643.         {
  1644.             OSMesaDestroyContext( ctx );
  1645.             if (the_bitmap)    delete the_bitmap;
  1646.             return TRUE;
  1647.         }
  1648.         return FALSE;
  1649.     };
  1650.             
  1651.     void AboutRequested(void)
  1652.     {
  1653.         char str[256];
  1654.         sprintf(str, "MesaDemos, ported by Tinic Urou\n<5uro@informatik.uni-hamburg.de>\nFreely distributable.");
  1655.         BAlert *the_alert = new BAlert("", str, "OK");
  1656.         the_alert->Go();
  1657.     };
  1658. };
  1659.  
  1660. int main( int argc, char *argv[] )
  1661. {
  1662.     MesaApp *the_app;
  1663.  
  1664.     Args(argc,argv);
  1665.  
  1666.     the_app = new MesaApp();
  1667.     the_app->Run();
  1668.     delete the_app;
  1669.  
  1670.     return 0;
  1671. }
  1672.